program a2;

uses crt;

     var i:integer;
     y,py:real;
	 podPierwiastkiem:real;
	 stopien:integer;
	 delta:real;

function sqrt2(x:real;a:real):real;
(*// x - najdokladniejsze, dotychczas znane przyblizenie wyniku, 
// a - liczba pierwiastkowana*)
begin
sqrt2:=0.5*(x+a/x);
end;

function pow(a:real; n:integer):real;
(*// a - podstawa potegowania
// n - wykladnik potegowania*)
var pw:real;
begin
pw:=1;
while (n>0) do
begin
 dec(n); (*// === n:=n-1;*)
 pw:=a*pw;
end;
pow:=pw;
end;

function sqrt3(x:real; a:real;n:integer):real;
(* x - najdokladniejsze, dotychczas znane przyblizenie wyniku, 
// a - liczba pierwiastkowana
// n - stopien pierwiastkowania*)
begin
sqrt3:=1/n*((n-1)*x + a/pow(x,n-1));
end;

begin

writeln(sqrt3(3.01,27,3));

write('Podaj liczbe pierwiastkowana: ');readln(podPierwiastkiem); writeln;
write('Podaj stopien pierwiastkowana [ze zbioru liczb calkowitych]: ');readln(stopien); writeln;
write('Podaj dokladnosc [10^-n, gdzie n>0 oraz n /in integer], domyslnie 10^(-3): ');readln(delta); writeln;
if (delta=0) then delta:=0.0001;

y:=2; (*// rozpoczynamy od czegos. *)
repeat
py:=y; (*//py oznacza poprzedni y (z poprzedniego wykonania petli) *)
y:=sqrt2(py,podPierwiastkiem); (*// y oznacza wartosc pierwiastka w momencie wykonywania aktualnej petli*)
until py-y<delta;
writeln('przyblizony pierwiastek kwadratowy tej liczby to: ',y);

y:=2; (*// rozpoczynamy od czegos. *)
repeat
py:=y; (*//py oznacza poprzedni y (z poprzedniego wykonania petli) *)
y:=sqrt3(py,podPierwiastkiem, stopien); (*// y oznacza wartosc pierwiastka w momencie wykonywania aktualnej petli*)
until py-y<delta;

writeln('przyblizony pierwiastek ',stopien, '-tego stopnia liczby', podPierwiastkiem:1:2, ' to ', y:1:2);
writeln('milego dnia. ', chr(13), chr(10), 'ursX');

readln;
end.